#!/bin/bash
# 目的: 安装 ftp虚拟用户及其配置
# 日期: 2024-12-27
# 作者: fanyongfeng

# 定义错误日志函数
log_error() {
    echo "[ERROR] $1"
}

# 检查是否为root用户
if [[ "$(id -u)" != "0" ]]; then
    log_error "检查是否为root用户"
    exit 1
fi

# 安装必要的包
echo "安装ftp和vsftpd..."
yum -y install vsftpd ftp || {
    log_error "安装失败"
    exit 1
}

# 备份vsftpd.conf文件
\cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

# 配置vsftpd，将vsftpd.conf中未注释的内容注释，再追加上配好的内容
#sed -i '/^[^#]/s/^/#/' /etc/vsftpd/vsftpd.conf
cat > /etc/vsftpd/vsftpd.conf << 'EOF'
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=NO

# 虚拟用户配置
guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/user_conf
EOF

# 判断使用db_load还是gdbmtool
# if ldd /usr/lib64/security/pam_userdb.so | grep -q "libdb"; then
#     echo "使用 db_load 生成数据库文件..."
#     cat > /etc/vsftpd/virtusers.txt << EOF
# ftp_user1
# 123
# ftp_user2
# 111
# ftp_user3
# 222
# EOF

#     db_load -T -t hash -f /etc/vsftpd/virtusers.txt /etc/vsftpd/virtusers.db
#     DB_FILE="/etc/vsftpd/virtusers"
# elif ldd /usr/lib64/security/pam_userdb.so | grep -q "libgdbm"; then
#     echo "使用 gdbmtool 生成数据库文件..."
#     gdbmtool /etc/vsftpd/virtusers.pag <<EOF
# store ftp_user1
# 123
# store ftp_user2
# 111
# store ftp_user3
# 222
# quit
# EOF
#     DB_FILE="/etc/vsftpd/virtusers"
# else
#     log_error "无法确定数据库工具，请检查 pam_userdb.so 的依赖"
#     exit 1
# fi

if [[ $(ldd /usr/lib64/security/pam_userdb.so) == *"libdb"* ]]; then
    echo "使用 db_load 生成数据库文件..."
    cat > /etc/vsftpd/virtusers.txt << EOF
ftp_user1
123
EOF

    db_load -T -t hash -f /etc/vsftpd/virtusers.txt /etc/vsftpd/virtusers.db
    DB_FILE="/etc/vsftpd/virtusers"
elif [[ $(ldd /usr/lib64/security/pam_userdb.so) == *"libgdbm"* ]]; then
    echo "使用 gdbmtool 生成数据库文件..."
    gdbmtool /etc/vsftpd/virtusers.pag <<EOF
store ftp_user1
123
quit
EOF
    DB_FILE="/etc/vsftpd/virtusers"
else
    echo "[ERROR] 无法确定数据库工具，请检查 pam_userdb.so 的依赖"
    exit 1
fi


# 创建用户列表
cat > /etc/vsftpd/user_list << EOF
ftp_user1
EOF

# 创建用户配置目录和文件
mkdir -p /etc/vsftpd/user_conf
echo "local_root=/data/ftp/ftp_user1" > /etc/vsftpd/user_conf/ftp_user1
# echo "local_root=/data/ftp/ftp_user2" > /etc/vsftpd/user_conf/ftp_user2
# echo "local_root=/data/ftp/ftp_user3" > /etc/vsftpd/user_conf/ftp_user3

# 创建FTP目录并设置权限
mkdir -p /data/ftp/ftp_user1
# mkdir -p /data/ftp/ftp_user2
# mkdir -p /data/ftp/ftp_user3
chown -R ftp:ftp /data/ftp/

# 配置PAM认证
cat > /etc/pam.d/vsftpd << EOF
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth    sufficient      /lib64/security/pam_userdb.so    db=${DB_FILE}
account sufficient      /lib64/security/pam_userdb.so    db=${DB_FILE}
EOF

# 设置文件权限
chmod 600 /etc/vsftpd/vritusers
chown root:root /etc/vsftpd/vritusers

# 重启服务
systemctl restart vsftpd
systemctl enable vsftpd
systemctl status vsftpd

# 检查服务状态
if systemctl is-active vsftpd >/dev/null 2>&1; then
    echo "vsftpd启动成功"
else
    log_error "vsftpd启动失败"
    exit 1
fi

# 输出配置信息
echo "测试用户: ftp_user1"
echo "测试密码: 123"
echo "curl -u 'ftp_user1':'123' ftp://<server_ip>/"

exit 0